use super::FudaThing;
use anyhow::Result;
use serde::Deserialize;
use serde::Serialize;
use surrealdb::sql::Thing;
use ts_rs::TS;

#[derive(Debug, Serialize, Deserialize, Default, TS, Clone)]
#[ts(export)]
pub struct Column {
    /// 唯一标识符，简单就用Table.name.column_name的值
    #[ts(as = "Option<FudaThing>")]
    pub id: Option<Thing>,

    /// column name
    pub name: String,
    /// columnn show/hide
    pub visible: Option<bool>,
    /// columnn title
    pub title: Option<String>,
    /// column detail desc
    pub desc: Option<String>,
}

#[derive(Debug, Serialize, Deserialize, Default, TS, Clone)]
#[ts(export)]
pub struct Table {
    /// 唯一标识符，简单就用Table.name的值
    #[ts(as = "Option<FudaThing>")]
    pub id: Option<Thing>,

    /// table name
    pub name: String,
    /// table title
    pub title: Option<String>,
    /// table detail desc
    pub desc: Option<String>,
    /// table columns
    pub columns: Option<Vec<Column>>,
}

// Using static with Mutex for potential interior mutability
lazy_static::lazy_static! {
    pub static ref KLINE_FLAT_TABLE: Table = Table {
        id: None,
        name:"KlineFlat".to_string(),
        title: Some("Kline & Indicators".to_string()),
        desc: Some("Description goes here".to_string()), // Replacing todo!()
        columns:Some( vec![
            //adx
            Column {
                name:"adx_signal0".to_string(),title:Some("Adx S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"adx_signal1".to_string(),title:Some("Adx S1".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"adx_adx".to_string(),title:Some("Adx adx".to_string()),..Default::default()
            },Column {
                name:"adx_di_plus".to_string(),title:Some("Adx +DI".to_string()),..Default::default()
            },Column {
                name:"adx_di_minus".to_string(),title:Some("Adx -DI".to_string()),..Default::default()
            },
            // aroon
            Column {
                name:"aroon_signal0".to_string(),title:Some("Arn S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"aroon_signal1".to_string(),title:Some("Arn S1".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"aroon_signal2".to_string(),title:Some("Arn S2".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"aroon_up".to_string(),title:Some("Arn UP".to_string()),..Default::default()
            },Column {
                name:"aroon_down".to_string(),title:Some("Arn Down".to_string()),..Default::default()
            },

            //aso
            Column {
                name:"aso_signal0".to_string(),title:Some("ASO S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"aso_signal1".to_string(),title:Some("ASO S1".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"aso_dif".to_string(),title:Some("ASO DIF".to_string()),..Default::default()
            },

            // boll
            Column {
                name:"boll_signal0".to_string(),title:Some("Boll S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"boll_upper".to_string(),title:Some("Boll UP".to_string()),..Default::default()
            },Column {
                name:"boll_middle".to_string(),title:Some("Boll Mid".to_string()),..Default::default()
            },Column {
                name:"boll_lower".to_string(),title:Some("Boll LOW".to_string()),..Default::default()
            },

            // cci
            Column {
                name:"cci_signal0".to_string(),title:Some("CCI S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"cci_oscillator".to_string(),title:Some("CCI Osc".to_string()),..Default::default()
            },


            // cko
            Column {
                name:"cko_signal0".to_string(),title:Some("CKO S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"cko_oscillator".to_string(),title:Some("CKO Osc".to_string()),..Default::default()
            },

            // cks
            Column {
                name:"cks_signal0".to_string(),title:Some("CKS S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"cks_signal1".to_string(),title:Some("CKS S1".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"cks_stop_long".to_string(),title:Some("CKs stl".to_string()),..Default::default()
            },Column {
                name:"cks_source".to_string(),title:Some("CKs src".to_string()),..Default::default()
            },Column {
                name:"cks_stop_short".to_string(),title:Some("CKs sts".to_string()),..Default::default()
            },

            // cmf
            Column {
                name:"cmf_signal0".to_string(),title:Some("Cmf S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"cmf_main".to_string(),title:Some("Cmf MAN".to_string()),..Default::default()
            },

            // cmo
            Column {
                name:"cmo_signal0".to_string(),title:Some("Cmo S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"cmo_oscillator".to_string(),title:Some("Cmo osc".to_string()),..Default::default()
            },

            // cpc
            Column {
                name:"cpc_signal0".to_string(),title:Some("CPC S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"cpc_signal1".to_string(),title:Some("CPC S1".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"cpc_signal2".to_string(),title:Some("CPC S2".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"cpc_main".to_string(),title:Some("CPC MAN".to_string()),..Default::default()
            },Column {
                name:"cpc_signal".to_string(),title:Some("CPC Sig".to_string()),..Default::default()
            },

            // dcc
            Column {
                name:"dcc_signal0".to_string(),title:Some("DCC S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"dcc_lower".to_string(),title:Some("DCC Low".to_string()),..Default::default()
            },Column {
                name:"dcc_middle".to_string(),title:Some("DCC mid".to_string()),..Default::default()
            },Column {
                name:"dcc_upper".to_string(),title:Some("DCC up".to_string()),..Default::default()
            },

            // dpo
            Column {
                name:"dpo_dpo".to_string(),title:Some("DPO dpo".to_string()),visible:Some(true),..Default::default()
            },

            //efi
            Column {
                name:"efi_signal0".to_string(),title:Some("EFI S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"efi_main".to_string(),title:Some("EFI Man".to_string()),..Default::default()
            },

            //eom
            Column {
                name:"eom_signal0".to_string(),title:Some("EOM S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"eom_main".to_string(),title:Some("EOM Man".to_string()),..Default::default()
            },

            //evl
            Column {
                name:"evl_signal0".to_string(),title:Some("EVL S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"evl_upper".to_string(),title:Some("EVL Up".to_string()),..Default::default()
            },Column {
                name:"evl_lower".to_string(),title:Some("EVL Low".to_string()),..Default::default()
            },Column {
                name:"evl_source2".to_string(),title:Some("EVL src2".to_string()),..Default::default()
            },

            //ftf
            Column {
                name:"ftf_signal0".to_string(),title:Some("FTF S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"ftf_signal1".to_string(),title:Some("FTF S1".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"ftf_main".to_string(),title:Some("FTF Man".to_string()),..Default::default()
            },Column {
                name:"ftf_signal".to_string(),title:Some("FTF Sig".to_string()),..Default::default()
            },

            // hma
            Column {
                name:"hma_signal0".to_string(),title:Some("HMA S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"hma_hma".to_string(),title:Some("HMA hma".to_string()),..Default::default()
            },


            // ikc
            Column {
                name:"ikc_signal0".to_string(),title:Some("IKC S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"ikc_signal1".to_string(),title:Some("IKC S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"ikc_tenkan".to_string(),title:Some("IKC tnk".to_string()),..Default::default()
            },Column {
                name:"ikc_kijun".to_string(),title:Some("IKC kij".to_string()),..Default::default()
            },Column {
                name:"ikc_spana".to_string(),title:Some("IKC pna".to_string()),..Default::default()
            },Column {
                name:"ikc_spanb".to_string(),title:Some("IKC pnb".to_string()),..Default::default()
            },

            // kama
            Column {
                name:"kama_signal0".to_string(),title:Some("Kama S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"kama_kama".to_string(),title:Some("Kama kama".to_string()),..Default::default()
            },

            // kdj
            Column {
                name:"kdj_signal0".to_string(),title:Some("Kdj S0".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"kdj_signal1".to_string(),title:Some("Kdj S1".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"kdj_signal2".to_string(),title:Some("Kdj S2".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"kdj_main".to_string(),title:Some("Kdj Man".to_string()),..Default::default()
            }, Column {
                name:"kdj_signal".to_string(),title:Some("Kdj Sig".to_string()),..Default::default()
            },


            // knc
            Column {
                name:"knc_signal0".to_string(),title:Some("Knc S0".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"knc_upper".to_string(),title:Some("Knc Up".to_string()),..Default::default()
            }, Column {
                name:"knc_source".to_string(),title:Some("Knc Src".to_string()),..Default::default()
            },Column {
                name:"knc_lower".to_string(),title:Some("Knc Low".to_string()),..Default::default()
            },

            // kst
            Column {
                name:"kst_signal0".to_string(),title:Some("Kst S0".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"kst_kst".to_string(),title:Some("Kst Kst".to_string()),..Default::default()
            }, Column {
                name:"kst_signal".to_string(),title:Some("Kst Sig".to_string()),..Default::default()
            },

            // KVO
            Column {
                name:"kvo_signal0".to_string(),title:Some("Kvo S0".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"kvo_signal1".to_string(),title:Some("Kvo S1".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"kvo_main".to_string(),title:Some("Kvo Man".to_string()),..Default::default()
            }, Column {
                name:"kvo_signal".to_string(),title:Some("Kvo Sig".to_string()),..Default::default()
            },

            // macd
            Column {
                name:"macd_signal0".to_string(),title:Some("Macd S0".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"macd_signal1".to_string(),title:Some("Macd S1".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"macd_macd".to_string(),title:Some("Macd DIF".to_string()),..Default::default()
            }, Column {
                name:"macd_signal".to_string(),title:Some("Macd DEA".to_string()),..Default::default()
            }, Column {
                name:"macd_bar".to_string(),title:Some("Macd bar".to_string()),..Default::default()
            },

            // mfi
            Column {
                name:"mfi_signal0".to_string(),title:Some("Mfi S0".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"mfi_signal1".to_string(),title:Some("Mfi S1".to_string()),visible:Some(true),..Default::default()
            },  Column {
                name:"mfi_upper".to_string(),title:Some("Mfi Up".to_string()),..Default::default()
            }, Column {
                name:"mfi_mfi".to_string(),title:Some("Mfi mfi".to_string()),..Default::default()
            },Column {
                name:"mfi_lower".to_string(),title:Some("Mfi Low".to_string()),..Default::default()
            },

            // mti
            Column {
                name:"mti_signal0".to_string(),title:Some("Mti S0".to_string()),visible:Some(true),..Default::default()
            },  Column {
                name:"mti_slow".to_string(),title:Some("Mti Slow".to_string()),..Default::default()
            }, Column {
                name:"mti_fast".to_string(),title:Some("Mti fast".to_string()),..Default::default()
            },

            //pcs
            Column {
                name:"pcs_signal0".to_string(),title:Some("Pcs S0".to_string()),visible:Some(true),..Default::default()
            },Column {
                name:"pcs_upper".to_string(),title:Some("Pcs Up".to_string()),..Default::default()
            }, Column {
                name:"pcs_lower".to_string(),title:Some("Pcs Low".to_string()),..Default::default()
            },

            // prs
            Column {
                name:"prs_signal0".to_string(),title:Some("Prs S0".to_string()),visible:Some(true),..Default::default()
            },

            // rsi
            Column {
                name:"rsi_signal0".to_string(),title:Some("Rsi S0".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"rsi_signal1".to_string(),title:Some("Rsi S1".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"rsi_upper".to_string(),title:Some("Rsi Up".to_string()),..Default::default()
            },Column {
                name:"rsi_main".to_string(),title:Some("Rsi Man".to_string()),..Default::default()
            },Column {
                name:"rsi_lower".to_string(),title:Some("Rsi Low".to_string()),..Default::default()
            },

            // rvi
            Column {
                name:"rvi_signal0".to_string(),title:Some("Rvi S0".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"rvi_signal1".to_string(),title:Some("Rvi S1".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"rvi_main".to_string(),title:Some("Rvi Man".to_string()),..Default::default()
            },Column {
                name:"rvi_signal".to_string(),title:Some("Rvi Sig".to_string()),..Default::default()
            },

            // sar
            Column {
                name:"sar_signal0".to_string(),title:Some("Sar S0".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"sar_sar".to_string(),title:Some("Sar Sar".to_string()),..Default::default()
            },Column {
                name:"sar_trend".to_string(),title:Some("Sar trd".to_string()),..Default::default()
            },

            // sei
            Column {
                name:"sei_signal0".to_string(),title:Some("Sei S0".to_string()),visible:Some(true),..Default::default()
            },  Column {
                name:"sei_main".to_string(),title:Some("Sei Man".to_string()),..Default::default()
            },Column {
                name:"sei_signal".to_string(),title:Some("Sei Sig".to_string()),..Default::default()
            },Column {
                name:"sei_oscillator".to_string(),title:Some("Sei osc".to_string()),..Default::default()
            },

            //tdsi
            Column {
                name:"tdsi_signal0".to_string(),title:Some("Tdsi S0".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"tdsi_signal1".to_string(),title:Some("Tdsi S1".to_string()),visible:Some(true),..Default::default()
            },  Column {
                name:"tdsi_main".to_string(),title:Some("TdSi Man".to_string()),..Default::default()
            },

            // trix
            Column {
                name:"trix_signal0".to_string(),title:Some("Trix S0".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"trix_signal1".to_string(),title:Some("Trix S1".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"trix_signal2".to_string(),title:Some("Trix S2".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"trix_main".to_string(),title:Some("Trix Man".to_string()),..Default::default()
            }, Column {
                name:"trix_signal".to_string(),title:Some("Trix Sig".to_string()),..Default::default()
            },

            //trsi
            Column {
                name:"trsi_signal0".to_string(),title:Some("Trsi S0".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"trsi_signal1".to_string(),title:Some("Trsi S1".to_string()),visible:Some(true),..Default::default()
            }, Column {
                name:"trsi_signal2".to_string(),title:Some("Trsi S2".to_string()),visible:Some(true),..Default::default()
            },  Column {
                name:"trsi_main".to_string(),title:Some("TrSi Man".to_string()),..Default::default()
            }, Column {
                name:"trsi_signal".to_string(),title:Some("TrSi Sig".to_string()),..Default::default()
            },

        ]),
    };
}

impl Table {
    /// @param name
    pub fn id_from(name: &str) -> Result<String> {
        Ok(format!("{}", name))
    }
}

impl Column {
    /// @param table_name
    /// @param column_name
    pub fn id_from(table_name: &str, column_name: &str) -> Result<String> {
        Ok(format!("{}.{}", table_name, column_name))
    }
}
